package com.jiang.controller;


import com.jiang.utlis.Constants;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author jiangjingbo
 * @version V1.0
 * @Project java2203
 * @Package com.jiang.servlet
 * @Description:
 * @Date 2022/5/20 15:38
 */

public class BaseServlet extends HttpServlet {
    /**
     * 所有的请求都会进入到这个方法中, 这个方法中通过反射机制来动态执行具体的业务方法
     * get请求, post请求, put请求, delete请求都会经过这个service方法
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 1. 获取请求参数(标识符, 方法名)
          String methodStr = req.getParameter(Constants.TAG);

         if(methodStr==null || methodStr ==""){
             //2. 如果method没有获取到值, 我们就跳转到首页
              methodStr=Constants.INDEX;
          }
          //3. 反射调用对应的业务逻辑方法
          //获取class类
         Class clazz = this.getClass();
          //4. 从类中获取方法对象
          //第一个参数是方法名称  第二个 第三个参数 是方法中的参数
          try {
              Method method = clazz.getMethod(methodStr, HttpServletRequest.class, HttpServletResponse.class);
              //5. 执行从类中获取到的方法对象, 接收方法执行结果
             //第一个参数是类类型    第二个第三个  是调用 login方法传实参
              Object invoke = method.invoke(this, req, resp);
              String jump =(String)invoke;
              System.out.println("=========this======"+this);
             //6. 根据返回的结果进行判断, 判断返回值不为空
              if (jump!=null){
                  //jump获取到后例如: "forward:http://localhost:8080/admin/admin.jsp"
                  //startsWith方法判断是否是前缀
                  if(jump.startsWith(Constants.FORWARD)){
                     //8. 判断执行后是重定向处理
                     //获取路径, 例如: http://localhost:8080/admin/admin.jsp
                                                         //返回一个新的字符串 返回该字符串的子串 xxx吧把这之前的去掉
                     String substring = jump.substring(jump.indexOf(Constants.FLAG)+1);
                      req.getRequestDispatcher(substring).forward(req,resp);
                  }else if(jump.startsWith(Constants.REDIRECT)){
                      //7. 判断执行后是请求转发处理
                     //获取路径, 例如: http://localhost:8080/admin/admin.jsp
                      String substring = jump.substring(jump.indexOf(Constants.FLAG)+1);
                      //执行请求转发
                      //执行重定向
                      resp.sendRedirect(substring);
                  }else{
                      //9. 判断如果是其他类型的返回值, 那么通过流写回到浏览器页面
                     resp.getWriter().println(jump);
                  }
              }
          } catch (NoSuchMethodException e) {
              e.printStackTrace();
          } catch (IllegalAccessException e) {
              e.printStackTrace();
          } catch (InvocationTargetException e) {
              e.printStackTrace();
          }
      }

    }

